#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<functional>
using namespace std;

////AVL数框架
//template<class K, class V>
//struct AVLTreeNode
//{
//	AVLTreeNode<K, V>* _left;
//	AVLTreeNode<K, V>* _right;
//	AVLTreeNode<K, V>* _parent;
//	pair<K, V> _kv;//val
//	int _bf;//平衡因子
//
//	//构造
//
//};
//
//template<class K, class V>
//class AVLTree
//{
//	typedef AVLTreeNode<K, V> Node;
//public:
//	//构造
//
//	//insert
//
//	//RotateR 右单旋
//
//private:
//	Node* _root;
//};

class Solution
{
public:
	void test(vector<string>& v)
	{
		//统计每个单词出现的次数，同时进行了字典序排序
		map<string, int> countMap;
		for (auto& str : v)
		{
			countMap[str]++;
		}
		//用出现的次数进行排序
		//multimap<int, string, greater<pair<int, string>>> sortMap; 这里仿函数的类型参数列表传的是key的类型，因为是用key来比较的
		multimap<int, string, greater<int>> sortMap;
		for (auto& kv : countMap)
		{
			sortMap.insert(make_pair(kv.second, kv.first));
		}
		//范围for遍历输出
		for (auto& kv : sortMap)
		{
			cout << kv.second << ":" << kv.first << endl;
		}
	}
};

int main()
{
	//存储输入的数据
	//string s = "A blockhouse is a small castle that has four openings through which to shoot.";
	string s;
	getline(cin, s);//获取一行，包在string头文件中
	vector<string> v;
	//转换数据：将s中的一句话转换为一个个单词存入v
	for (int i = 0; i < s.size() && s[i] != '.'; i++)
	{
		string world;
		while (s[i] != ' ' && s[i] != '.')
		{
			if (s[i] >= 'A' && s[i] <= 'Z')
			{
				s[i] = s[i] + 32;
			}
			world += s[i];
			i++;
		}
		v.push_back(world);
	}
	//解决方案：
	Solution sol;
	sol.test(v);

	return 0;
}